package com.liang.test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 测试题：请使用Java编写字母统计程序。
 * 要求统计给定（英文）文本文件中，各个字母出现的个数，以及单词个数和PD开头的单词出现的次数。
 * 注：单词定义为逗号、句号、空格分割的字符串（不用考虑其它标点符号）。
 * 时间为20分钟。代码发邮箱 CRANE@QH-INFO.COM
 */
public class LetterCount {
    public static void main(String[] args) {
        //要读取的文件路径
        String filename = "D:\\words.txt";

        try {
            //存储字母出现次数，键是字母，值是出现次数
            Map<Character, Integer> letterCount = new HashMap<>();
            int wordCount = 0; // 单词个数
            int pdWordCount = 0; // 以PD开头的单词个数

            BufferedReader reader = new BufferedReader(new FileReader(filename));
            String line;
            while ((line = reader.readLine()) != null) {
                // 将文本按逗号、句号和空格分割成单词
                String[] words = line.split("[,\\s]+");
                // 遍历每个单词
                for (String word : words) {
                    wordCount++;
                    if (word.startsWith("PD")) {
                        pdWordCount++;
                    }
                    // 统计单词中各个字母的出现次数
                    for (char c : word.toCharArray()) {
                        if (Character.isLetter(c)) {
                            char lowercase = Character.toLowerCase(c);
                            letterCount.put(lowercase, letterCount.getOrDefault(lowercase, 0) + 1);
                        }
                    }
                }
            }
            reader.close();

            // 输出字母出现次数统计结果
            System.out.println("字母出现次数统计：");
            for (Map.Entry<Character, Integer> entry : letterCount.entrySet()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }

            // 输出单词个数和以"PD"开头的单词出现次数
            System.out.println("\n单词个数：" + wordCount);
            System.out.println("以\"PD\"开头的单词出现次数：" + pdWordCount);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
